home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / diskutil / gemar220.lzh / GEMAR220 / PLUGIN / SOURCE / SPACE.M < prev   
Encoding:
Text File  |  1993-12-18  |  6.8 KB  |  221 lines

  1. (*-------------------------------------------------------------------------*)
  2. (*-                                                                                                                                             -*)
  3. (*-     Name                        : Space                                                                                         -*)
  4. (*-     Version                 : 1.000                                                                                         -*)
  5. (*-     Art                         : Module                                                                                        -*)
  6. (*-     Aufgabe                 : PlugIn für GEMAR                                                                    -*)
  7. (*-     Autor                     : Steffen Engel                                             (C) 93                -*)
  8. (*-     Letzte Änderung : 27.10.1993, 12:35:52                                                            -*)
  9. (*-                                                                                                                                             -*)
  10. (*-------------------------------------------------------------------------*)
  11. (*-------------------------------------------------------------------------*)
  12. (*-                                                                                                                                             -*)
  13. (*- Beschreibung    : Adaption des Space-Kommandos auf Streamer mit                 -*)
  14. (*-                                 beschränktem Parameterumfang.                                                 -*)
  15. (*-                                 Dieses ist für ExaByte-Streamer.                                            -*)
  16. (*-                                                                                                                                             -*)
  17. (*-------------------------------------------------------------------------*)
  18. (*-------------------------------------------------------------------------*)
  19. (*-                                                                                                                                             -*)
  20. (*-     History                                                                                                                         -*)
  21. (*-                                                                                                                                             -*)
  22. (*-                                                                                                                                             -*)
  23. (*-     Vers | Datum        | Beschreibung                                                                            -*)
  24. (*-  ------|----------|---------------------------------------                        -*)
  25. (*-     1.0  | 15.11.93 | erstellt                                                                                    -*)
  26. (*-              |                    |                                                                                                     -*)
  27. (*-                                                                                                                                             -*)
  28. (*-                                                                                                                                             -*)
  29. (*-                                                                                                                                             -*)
  30. (*-------------------------------------------------------------------------*)
  31. MODULE Space;
  32.  
  33. IMPORT SYSTEM, CPX;
  34. FROM SYSTEM IMPORT BYTE;
  35.  
  36. (* Magic-Lib *)
  37. FROM MagicSys     IMPORT
  38.                                 (* Const *) Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5,
  39.                                                         Bit6, Bit7, Bit8, Bit9, Bit10, Bit11, Bit12,
  40.                                                         Bit13, Bit14, Bit15,
  41.                                 (* Type  *) LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
  42.                                                         sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET;
  43.  
  44. IMPORT void;
  45.  
  46.  
  47. CONST ParmVersion = 0000H;                 (* Version des Prameterblockes *)
  48.             PathLen         = 512;
  49.  
  50. TYPE
  51.         tSpacePrivate  = RECORD
  52.                                             Version : SHORTCARD;
  53.                                             (*$K+*)
  54.                                             In    : PROCEDURE ((* Cmd      *) SYSTEM.ADDRESS,
  55.                                                                              (* CmdLen *) SHORTCARD,
  56.                                                                              (* Buffer *) SYSTEM.ADDRESS,
  57.                                                                              (* Transferlen *)    LONGCARD,
  58.                                                                              (* CmdTimeout *) LONGCARD,
  59.                                                                              (* DataTimeout *) LONGCARD) : SHORTCARD;
  60.                                             Out : PROCEDURE ((* Cmd      *) SYSTEM.ADDRESS,
  61.                                                                              (* CmdLen *) SHORTCARD,
  62.                                                                              (* Buffer *) SYSTEM.ADDRESS,
  63.                                                                              (* Transferlen *)    LONGCARD,
  64.                                                                              (* CmdTimeout *) LONGCARD,
  65.                                                                              (* DataTimeout *) LONGCARD) : SHORTCARD;
  66.                                             (*$K=*)
  67.                                         END;
  68.          tpSpacePrivate = POINTER TO tSpacePrivate;
  69.  
  70.          tPlugEnvironment
  71.                 = RECORD
  72.                         (* aktuelle Parameterversion = 1.00 = 0100H *)
  73.                         Version  : sINTEGER;                                                    (* Version zeigt Umfang der Parameter an     *)
  74.                         private  : tpSpacePrivate;
  75.                         ApplId     : sINTEGER;                                                    (* Applikationsid des rufenden Programmes  *)
  76.                         VDIHandle : sINTEGER;                                                 (* Workstation des Hauptprogrammes                 *)
  77.                         PlugPath : POINTER TO ARRAY[0..PathLen-1] OF CHAR;    (* Name und Pfad des PlugIn, kann auch
  78.                                                                                                                          relativ sein                                                      *)
  79.                         (*$K+*)
  80.                         Alert      : PROCEDURE(     (* def     *) sINTEGER,
  81.                                                                  VAR(* msg     *) STRING) : sINTEGER;
  82.                         (*$K=*)
  83.                     END;
  84.  
  85.          tpPlugEnvironment = POINTER TO tPlugEnvironment;
  86.  
  87.  
  88.  
  89. VAR PlugEnv : tpPlugEnvironment;
  90.  
  91. TYPE tpSpaceParms = POINTER TO tSpaceParms;
  92.          tSpaceParms    = RECORD
  93.                                             Code    : SHORTCARD;
  94.                                             Count : LONGINT;
  95.                                         END;
  96.          tCmdBlock        = RECORD
  97.                                             Command : BYTE;
  98.                                             LunAdr    : BYTE;
  99.                                             ADR         : SHORTCARD;
  100.                                             Len         : BYTE;
  101.                                             Flags     : BYTE;
  102.                                         END;    
  103.  
  104. CONST SpaceBlock                = 0;
  105.             SpaceMark                 = 1;
  106.             SpaceSerie                = 2;
  107.             SpaceEnd                    = 3;
  108.             SpaceSetmarks         = 4;
  109. PROCEDURE SpaceCmd(Code:SHORTCARD;Count:LONGINT;
  110.                                      Timeout:LONGCARD) : SHORTCARD;
  111.  
  112.  
  113.     VAR
  114.  
  115.         CmdBlock             : tCmdBlock;
  116.  
  117.         
  118.  
  119. BEGIN
  120.  
  121.     WITH CmdBlock DO
  122.  
  123.         Command:=BYTE(011H);
  124.  
  125.         LunAdr:=BYTE(VAL(CHAR, Code MOD 4));
  126.  
  127.         ADR:=VAL(SHORTCARD, LONGCARD(Count) DIV 0100H);
  128.  
  129.         Len:=BYTE(VAL(CHAR, LONGCARD(Count) MOD 0100H));
  130.  
  131.         Flags:=BYTE(0);
  132.  
  133.     END;
  134.  
  135.     RETURN PlugEnv^.private^.In(SYSTEM.ADR(CmdBlock), 6, NIL, 0, Timeout, 400);
  136.  
  137. END SpaceCmd;
  138.  
  139.  
  140. PROCEDURE CheckforBlankCheck() : SHORTCARD;
  141.  
  142. TYPE tSenseData = RECORD
  143.  
  144.                                         HeadBits         : BYTE;
  145.  
  146.                                         SegmentNo      : BYTE;
  147.  
  148.                                         SenseKey         : BYTE;
  149.  
  150.                                         InfoByte1      : BYTE;
  151.  
  152.                                         InfoByte2      : BYTE;
  153.  
  154.                                         InfoByte3      : BYTE;
  155.  
  156.                                         InfoByte4      : BYTE;
  157.  
  158.                                         AddLength      : BYTE;
  159.  
  160.                                         CmdSpecific  : LONGCARD;
  161.  
  162.                                         AddSense         : SHORTCARD;
  163.  
  164.                                     END;
  165.  
  166. VAR SenseData : tSenseData;
  167.  
  168.         CmdBlock    : tCmdBlock;
  169.  
  170.         retCode     : SHORTCARD;
  171.  
  172.  
  173.     BEGIN
  174.  
  175.         (* Kommando zusammenstellen *)
  176.  
  177.         WITH CmdBlock DO
  178.  
  179.             Command := BYTE(03H);
  180.  
  181.             LunAdr    := BYTE(0);
  182.  
  183.             ADR         := 0;
  184.  
  185.             Len         := BYTE(14);
  186.  
  187.             Flags     := BYTE(0);
  188.  
  189.         END;
  190.  
  191.         retCode := PlugEnv^.private^.In(SYSTEM.ADR(CmdBlock), 6,
  192.  
  193.                                                                         SYSTEM.ADR(SenseData), 14, 400, 400);
  194.  
  195.         IF retCode = 0
  196.  
  197.             THEN
  198.  
  199.              IF (VAL(SHORTCARD, CHAR(SenseData.HeadBits)) DIV 010H MOD 08H # 07H)      (* extended Sense? *)
  200.  
  201.                  OR (VAL(SHORTCARD, CHAR(SenseData.SenseKey)) MOD 010H # 08H)  (* Blank Check?        *)
  202.  
  203.                     THEN
  204.  
  205.                         retCode := 0FFFFH;        (* Was'n Das'n? *)
  206.  
  207.                     END;
  208.  
  209.             END;
  210.  
  211.         RETURN retCode;
  212.  
  213.     END CheckforBlankCheck;
  214.  
  215.  
  216. PROCEDURE SpaceEOM() : SHORTCARD;
  217.  
  218. VAR result : SHORTCARD;
  219.  
  220.  
  221.     BEGIN
  222.  
  223.         LOOP
  224.  
  225.             (* einen Block überspringen (erster Datenblock)
  226.  
  227.              * Wenn es fehlschlägt, wurde vermutlich das Bandende erreicht
  228.  
  229.              *)
  230.  
  231.             result := SpaceCmd(SpaceBlock, 1, 1000);
  232.  
  233.             IF result # 0
  234.  
  235.                 THEN
  236.  
  237.                     (* Hier könnte man checken, wah? *)
  238.  
  239.                     RETURN CheckforBlankCheck();
  240.  
  241.                 END;
  242.  
  243.  
  244.             (* Dann zum Ende dieses Backup, Fehlschlag bedeutet Fehler
  245.  
  246.              * im Bandaufbau *)
  247.  
  248.             result := SpaceCmd(SpaceMark, 6, 120000);
  249.  
  250.             IF result # 0
  251.  
  252.                 THEN
  253.  
  254.                     (* Fehler melden *)
  255.  
  256.                     RETURN result;
  257.  
  258.                 END;
  259.  
  260.         END;
  261.  
  262.     END SpaceEOM;
  263.  
  264.  
  265. (*$K+ $E+ *)
  266. PROCEDURE CallPlug(parms : tpSpaceParms) : LONGINT;
  267.  
  268.  
  269.     BEGIN
  270.  
  271.         IF parms^.Code = SpaceEnd
  272.  
  273.             THEN
  274.  
  275.                 (* ExaByte kann kein Space to end, daher anders tricksen *)
  276.  
  277.                 RETURN SpaceEOM();
  278.  
  279.             ELSE
  280.  
  281.                 RETURN SpaceCmd(parms^.Code, parms^.Count, 1200);
  282.  
  283.             END;
  284.  
  285.     END CallPlug;
  286. (*$K= $E+ *)
  287.  
  288.  
  289. BEGIN
  290.  
  291.  
  292.     PlugEnv := tpPlugEnvironment(CPX.pXCPB);
  293.  
  294.  
  295.     IF PlugEnv^.private^.Version # 0101H
  296.  
  297.         THEN
  298.  
  299.             void.I := PlugEnv^.Alert(1, '[3][PlugIn: Space-Installation:|falsche Parameterversion][Aha]');
  300.  
  301.         ELSE
  302.  
  303.             CPX.Return(SYSTEM.ADDRESS(CallPlug));
  304.  
  305.         END;
  306.  
  307.  
  308. END Space.
  309.         
  310.     
  311.